﻿package utils {

	import flash.utils.Dictionary;

	/**
	 * 存储数据常用类
	 * 通过{索引-对象}存储和读取对象
	 * 可以获得存储对象的数量.通过遍历索引来获取所有的存储数据
	 */
	public final class HashMap {

		/**
		 * 长度
		 */
		private var _length:int;

		/**
		 * 数据存储对象
		 */
		private var _content:Dictionary;

		/**
		 * 构造函数
		 */
		public function HashMap() {
			_length=0;
			_content=new Dictionary();
		}

		/**
		 * 获得HashMap的存储对象的数量
		 * @return
		 */
		public function size():int {
			return _length;
		}

		/**
		 * 判断HashMap中是否存储了数据. TRUE为空(没有存储), FALSE表示不为空(存储了数据)
		 * @return
		 *
		 */
		public function isEmpty():Boolean {
			return (_length == 0);
		}

		/**
		 * 获得HashMap存储对象的所有索引
		 * @return
		 */
		public function keys():Array {
			var temp:Array=new Array(_length);
			var index:int=0;
			for (var i:* in _content) {
				temp[index]=i;
				index++;
			}
			return temp;
		}

		/**
		 * 获得HashMap存储的对象
		 * @return
		 *
		 */
		public function values():Array {
			var temp:Array=new Array(_length);
			var index:int=0;
			for each (var i:* in _content) {
				temp[index]=i;
				index++;
			}
			return temp;
		}


		/**
		 * 判断HashMap是否已经存在该数据对象
		 * @param value			对象
		 * @return
		 */
		public function containsValue(value:*):Boolean {
			for each (var i:* in _content) {
				if (i === value) {
					return true;
				}
			}
			return false;
		}

		/**
		 * 判断HashMap是否已经存在该索引
		 * @param key			索引
		 * @return
		 *
		 */
		public function containsKey(key:*):Boolean {
			if (_content[key] != undefined) {
				return true;
			}
			return false;
		}

		/**
		 * 通过索引获得存储的对象
		 * @param key		索引
		 * @return
		 */
		private function get(key:*):* {
			var value:*=_content[key];
			if (value !== undefined) {
				return value;
			}
			return null;
		}

		/**
		 * 通过索引获得存储的对象
		 * @param key
		 * @return
		 */
		public function getValue(key:*):* {
			return get(key);
		}

		/**
		 * 通过{索引-对象}存储对象
		 * @param key		索引
		 * @param value		对象
		 * @return
		 *
		 */
		public function put(key:*, value:*):* {
			if (key == null) {
				throw new ArgumentError("cannot put a value with undefined or null key!");
				return undefined;
			} else if (value == null) {
				return remove(key);
			} else {
				var exist:Boolean=containsKey(key);
				if (!exist) {
					_length++;
				}
				var oldValue:*=this.get(key);
				_content[key]=value;
				return oldValue;
			}
		}

		/**
		 * 通过索引移除存储对象
		 * @param key		索引
		 * @return
		 */
		public function remove(key:*):* {
			var exist:Boolean=containsKey(key);
			if (!exist) {
				return null;
			}
			var temp:*=_content[key];
			delete _content[key];
			_length--;
			return temp;
		}

		/**
		 * 清空HashMap
		 */
		public function clear():void {
			_length=0;
			_content=new Dictionary();
		}

		/**
		 * 拷贝一个HashMap对象
		 * @return
		 */
		public function clone():HashMap {
			var temp:HashMap=new HashMap();
			for (var i:* in _content) {
				temp.put(i, _content[i]);
			}
			return temp;
		}

		/**
		 * 转换为String格式显示出来
		 * @return
		 */
		public function toString():String {
			var ks:Array=keys();
			var vs:Array=values();
			var temp:String="HashMap Content:\n";
			for (var i:int=0; i < ks.length; i++) {
				temp+=ks[i] + " -> " + vs[i] + "\n";
			}
			return temp;
		}

	}
}
